package com.zhou.function

/*
 * @Description: 方法调用有两种方式：
 *        传值调用（call-by-value):先计算参数表达式的值，再应用到函数内部
 *        传名调用（call-by-name）:将未计算的参数表达式直接应用到函数内部。使用传名调用时，解释器都会计算一次表达式的值。
 * @Author: ZhOu 
 * @Date: 2018/6/11
 */
object FunctionCall {

  def main(args: Array[String]): Unit = {
    dep(time())
    pointParam(b = "张三", a = 12)
    multiParam("a", "b")
    multiParam("a", "b", "c")

    println(inc("ss", 123))
    userDir()
  }

  def time() = {
    println("time方法执行")
    System.nanoTime
  }

  def dep(t: => Long) = {
    println("dep方法执行")
    println("参数是" + t)

    //此时调用，time方法会再次执行计算
    t
  }

  //指定参数名传值，可以不分顺序，但是参数名要一致
  def pointParam(a: Int, b: String): Int = {
    println("a=" + a, "b=" + b)
    a
  }

  //可变参数
  def multiParam(s: String*): Unit = {
    s.foreach(println(_))

    //    for (t <- s) {
    //      println(t)
    //    }
  }

  def apply(f: Int => String, v: Int) = f(v)

  //匿名函数
  var inc = (s: String, t: Int) => s.concat(t + "")

  //无参匿名函数
  var userDir = () => println(System.getProperty("user.dir"))
}
